參考自此書 The Art of Scalability: Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise
是一群技術專家總結出來對於單體應用拓展的三個維度(X-Y-Z軸).
依照這擴展模式, 可以將一個單體架構(大方塊就是一個單體系統)無限擴展.
針對單體程序進行多個複製, 或者對資料庫進行擴容, 並組成cluster.
再透過負載均衡服務針對N個實例進行請求分配, 這樣每個實例只需要處理1/N的負載.
進而提高吞吐量與可用性.
Z軸擴展也是複製單體程序到多個實例上, 但跟X軸不同的是, 每個實例僅負責一部分的資料子集合.
換句話說, 就是根據某些規則絕對該請求到那一個實例程序上.
舉例, B2C透過user_id是偶數的去第一台, 奇數的去第二台.
又或是電商根據SKU種類去切分片;
掏寶根據用戶的請求地區進行分區, 在各區各自建立cluster, 縮短處理時間.
或者電腦版用戶來服務A, 安卓用戶來服務B, IOS用戶來服務C.
B2B通常根據公司或是集團組織進行切分.
因為X跟Z軸都沒能解決開發問題還有程式或者依賴的複雜度問題.
Y軸就是來解決這維度的.
進行功能的切分, 根據業務能力來劃分.
業務能力有人會依照"動詞Verb"來劃分, 舉例:結帳、驗證、購買、註冊;
也有是按照"名詞Noun"來做分解, 舉例:客戶、訂單、報表、商品列表.
或者根據DDD的Subdomain.
定義出接口與通訊的協定. 就回到上篇的微服務的設計原則.
每個切分出來的服務都是一組專注于特定業務能力的實現, 高內聚的職責組成.
前後端在邏輯與物理上進行切分, 彼此都能獨立佈署, 各自專注在自身業務上.
透過後端定義好的接口與格式, 前端就能快速串接.
前後端分離後, 靜態資源也能推到CDN或是Nginx內, 減低server壓力, 讓後端資源用在處理動態資遠請求上.
服務盡量無狀態化, 就能任意擴容. 這太抽象了XD
這狀態指的是如果一個資料會被多個服務彼此共享存取操作, 才能完成一次的事務處理, 這資料就稱為"狀態".
所有依賴于這資料的服務就是被稱為"有狀態的服務".
所以要想辦法把服務變成純粹無狀態的計算/業務服務.
這資料呢, 移到"有狀態資料的服務"上, 像是Redis, Database, 將這些有狀態的資料移到其他地方存放.
這樣子這些無狀態的業務服務, 就能隨時動態收放, 不必考慮數據同步問題了.
這也是為什麼資料庫很難動態擴容的原因, 因為有資料一致性與資料完整性的問題存在.
無狀態的HTTP協議, 很適合用來擴展.
JSON格式相對於XML輕量很多, 可讀性又強.
REFTful開發框架/套件琳瑯滿目,生態圈非常完善.
滿足RESTful特性的資源被GET時, 可以被cache, 減少回應時間, 提昇體驗.
各平台or裝置都可重複利用這些服務.